﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
	// 浮点数的存储
	//常见的浮点数：3.14159、1E10等，浮点数家族包括： float、double、long double 类型。
	//浮点数表⽰的范围： float.h 中定义

	float ff = 99.7f;
	printf("%f\n",ff);
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为：%d\n", n);
	printf("*pFloat的值为：%f\n", *pFloat);
	//00000000000000000000000000001001
	//0 00000000 00000000000000000001001
	//S=0
	//E=-126
	//M=0.00000000000000000001001
	//v=0.00000000000000000001001*2^(-126)
	*pFloat = 9.0;
	printf("num的值为：%d\n", n);
	printf("*pFloat的值为：%f\n", *pFloat);
	//1001.0
	//1001*2^3
	//(-1)^0*1.001*2^3
	//S=0
	//E=3
	//M=1.001
	//0 100000010 00100000000000000000000
	//S   E+127             M 

	// 浮点数存的过程
	//十进制： 5.5
	//二进制： 101.1
	//科学计数法：1.011*2^2  S=0 M=1.011 E=2
	// V   =  (−1)^S* M ∗ 2^E
	// (−1)S 表⽰符号位，当S = 0，V为正数；当S = 1，V为负数
	// M 表⽰有效数字，M是大于等于1，⼩于2的
	// 存入内存时E的真实值必须再加上⼀个中间数，对于8位的E，这个中间数是127；对于11位的E，这个中间数是1023
	// 2^E 表⽰指数位
	//对于32位(float)的浮点数，最⾼的1位存储符号位S，接着的8位存储指数E，剩下的23位存储有效数字M
	//对于64位(double)的浮点数，最⾼的1位存储符号位S，接着的11位存储指数E，剩下的52位存储有效数字M
	float f = 5.5f;
	//S=0 E=2+127=129 10000001 M=011 01100000000000000000000
	//01000000101100000000000000000000
	//40 B0 00 00
	
	// 浮点数取的过程
	// 指数E从内存中取出还可以再分成三种情况：
	// E不全为0或不全为1
	//0 10000001 01100000000000000000000
	//1.01100000000000000000000*2^(129-127)
	//E全为0
	//浮点数的指数E等于1-127（或者1-1023）即为真实值，有效数字M不再加上第⼀位的1，⽽是还原为0.xxxxxx的⼩数。这样做是为了表⽰±0，以及接近于0的很⼩的数字。
	//E全为1
	//如果有效数字M全为0，表示±无穷大（正负取决于符号位s）

	//1.有些浮点数在内存中无法精确保存
	//2.double类型的精度比float更高
	//3.两个浮点数比较大小的时候 直接使用== 可能存在问题！需要给一个精度
	//f=5.6 给一个精度0.00000001 if(f-5.6>-0.00000001&&f-5.6<=0.00000001)或if(abs(f-5.6)<=0.00000001)
	return 0;
}